實作一個文字輸入語音輸出的工具,有播放、暫停、語速、音量調整功能。
可以搭配文件 SpeechSynthesisUtterance 、Window事件 : speechSynthesis
先調用語音 api 物件
const msg = new SpeechSynthesisUtterance();
設定 api 物件為畫面文字轉成語音內容,順便 console 出來看一下
msg.text = document.querySelector('[name="text"]').value;
console.log(msg);
利用 speechSynthesis
監聽 voices 事件變化,有就操作 func
: populateVoices 來取得聲音。
建立事件,取得聲音
function populateVoices() {
vices = this.getVoices();
console.log(voices);
}
speechSynthesis.addEventListener('voiceschanged', populateVoices);
利用 innerHTML
, map
, join
新增下拉選單內容(func
: populateVoices)
voicesDropdown.innerHTML = voices
.map(voice => `<option value="${voice.name}">${voice.name}(${voice.lang})</option>`)
.join('');
建立下拉選單變更的事件
監聽 voicesDropdown
是否有改變,即觸發 func
: setVoice
function setVoice() {
console.log('Changing voice');
}
voicesDropdown.addEventListener('change', setVoice)
利用find
找到點擊到的 this.value
與 voice.name
一樣,就賦值給 msg
msg.voice = voices.find(voice => voice.name === this.value);
製作語音播放、暫停功能
先建立 func
: toggle,如果 startOver
為 true 時播放。
function play(startOver = true) {
speechSynthesis.cancel();
if (startOver) {
speechSynthesis.speak(msg);
}
}
監聽 speakButton
是否有被點擊,即觸發 func
: toggle
speakButton.addEventListener('click', toggle);
監聽 stopButton
是否有被點擊,即觸發 func
: play,並傳入 false
stopButton.addEventListener('click', () => play(false));
製作文字框、語速、音量調整功能
利用 ,
+ querySelectorAll
把文字框和拖拉條選起來
const options = document.querySelectorAll('[type="range"], [name="text"]');
利用 forEach
找出對應的 option 再監聽是否有改變,即觸發 func
: setOption
options.forEach(option => option.addEventListener('change', setOption));
把有改變的屬性賦予新的值
msg[this.name] = this.value;